package com.javastudy.liuhouse.jdbc18;

import com.javastudy.liuhouse.jdbc18.bean.Student;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;


//使用JDBC的batch操作会大大的提高执行效率,对内容而言,参数不同的sql，有优先考虑batch操作
public class jdbcBatch {
    //JDBC连接的URL,不同的数据库有不同的格式
    private String JDBC_URL = "jdbc:mysql://localhost:3306/learnjdbc?useSSL=false&characterEncoding=utf8";
    private String JDBC_USER = "root";
    private String JDBC_PASSWORD = "root";

    //批量添加数据
    //这些是jdbc
    //1.学会这些东西 自己也是可以搭建框架 来做这些操作
    //2.其实框架的底层就是这些  学会了这些  基本也就知道了底层是什么样了
    //4.学会这些东西  就可以灵活处理了
    @Test
    public void batchAdddata() {
        //定义需要添加的数据
        try (Connection connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
            String sql = "INSERT INTO students(name, gender , grade , score) VALUES(? , ? , ? , ?)";
            try (PreparedStatement ps = connection.prepareStatement(sql)) {
                Student[] students = buildStudents();
                //对同一个PreparedStatement反复设置参数并调用addBatch()
                for (Student s : students){
                    ps.setString(1 , s.getName());
                    ps.setInt(2 , s.getGender());
                    ps.setInt(3,s.getGrade());
                    ps.setInt(4 , s.getScore());
                    //利用sql数据库的这一特性，把同一个sql但是参数不同的若干次操作合并为一个batch执行
                    ps.addBatch();
                }
                //执行batch [定义一个 int 类型的数组]
                int[] ns = ps.executeBatch();
                //使用 for 循环 读取结果
                for(int n : ns){
                    //batch中每个sql执行的结果数量
                    System.out.println(n + "inserted");
                }
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }


    //构建数组对象
    private Student[] buildStudents() {
        //创建一个 Student 对象数组
        Student[] students = new Student[3];
        //初始化数组中的每一个对象
        students[0] = new Student("Alice" , 1 , 2 , 80);
        students[1] = new Student("Blice" , 2 , 1 , 81);
        students[2] = new Student("Clice" , 1 , 2 , 82);
        //遍历数组并打印每个学生的信息
        for(Student student : students){
            System.out.println(student);
        }
        return students;
    }

}
